﻿using System;
using System.Windows.Forms;

using Presentation;
using BusinessLogic;
using DataAccess;

// ******************************************************************************************************************************************************************************
// ******************************************************************************************************************************************************************************
// ******************************************************************************************************************************************************************************

		//DOCUMENTATION TECHNIQUE

		//Utlisation ".Net Framework 4 Client Profile"

		//Le but de ce projet est de construire une simple application, ici un annuaire, avec une séparation claire des différentes couches de l'application en architecture 3-tiers.
		//Ce projet à pour but  de définir un exemple de projet C# afin d'organiser l'ensemble des couches d'une appication multi-couches.
		//Avec les couches Presentation <-> BusinessLogic <-> DataAcess indépendantes.
		//Et les couches Interface, Tool et Application transversales

		//- Application : Couche d'entrée de l'application qui applique une injection de dépendance sur l'ensemble des couches afin de transmettre les objets instanciés utiles pour chaque couche.

		//- Presentation : Couche de présentation composée d'une vue et d'un controller de vues. Ici on pourrait remplacer la vue en WinForm par une en WPF.
		//- Presentation_View_Winform : contient l'IHM en WinForm (possible d'être remplacé par du WPF)
		//- Presentation_Controller : controlleur de vue (peut etre garder si la nouvelle respecte l'interface IViewMain)

		//- BusinessLogic : Couche d'intelligence composée des entités métiers et d'un controller.
		//- BusinessLogic_Entity : Entité métier 
		//- BusinessLogic_Controller : Controlleur des règles métiers (intelligence de l'application)

		//- DataAccess : Couche data composée d'un DAO et d'une BDD en sérialisation binaire. Ici on pourrait changer le couple pour couple ADO.NET / SQLServer CE
		//- DataAccess_Controller : Gestionnaire d'acccés aux données en binaire (peut etre remplacé avec sa BDD par DAO avec SQLServerCE)
		//- DataAccess_BinarySerialization : BDD de l'application

		//- Interface : Couche transverse contenant toutes les interfaces des classes de l'application
		//- Tool : Couche transverse contenant les classes outils utiles et génériques

		//L'exemple sera un gestionnaire d'annuaire simple avec une IHM en WinForm et une sauvegarde des données en binaire.
		//Toutes les couches utilisent des interfaces excepté la couche application qui est chargé d'ingéter les instations utiles dans chaque classe
		//et la classe BusinessLogic_Controller qui a la responbilité de créer de nouvelles Entity.

// ******************************************************************************************************************************************************************************
// ******************************************************************************************************************************************************************************
// ******************************************************************************************************************************************************************************



namespace Application
{
	static class Program
	{
		/// <summary>
		/// Point d'entrée principal de l'application.
		/// </summary>
		[STAThread]
		static void Main()
		{			
			// INJECTION DE DEPENDENCE
			
			
			IPersonneEntity oPersonneEntity					= new PersonneEntity();

			// Création du controlleur de données
			IControllerData<string, IPersonneEntity>	oControllerData = new ControllerData<string, IPersonneEntity>( oPersonneEntity.NomTable );

			// Création du controlleur métier
			IControllerBusinessPersonne oControllerBusiness	= new ControllerBusinessPersonne(oControllerData);			
			
			// Création de la vue
			IViewMain oViewMain								= new ViewMain();			

			// Création du controlleur de vue
			IControllerViewMain oControllerView				= new ControllerViewMain(oViewMain, oPersonneEntity, oControllerBusiness);			

			// Enrichissement controlleur de la vue
			oViewMain.ControllerView						= oControllerView;
			
			// LANCEMENT DE L'APPLICATION
			oControllerView.Start();
		}
	}
}